package com.dog.framework.redis.config;

import com.dog.framework.redis.constant.RedisCommonConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;

/**
 * 一定要在RedisAutoConfiguration配置，否则自定义的RedisTemplate不生效
 */
@Slf4j
@Configuration
//@ConditionalOnClass(name = {"com.dog.auth.receiver.RedisMessageReceiver"})
// @ConditionalOnBean(name = "RedisMessageReceiver")
@Conditional(RedisListenerCondition.class)
public class RedisListenerAutoConfig {


    /**
     * 监听白名单变通知主题
     */
    private static final String REDIS_MQ_TOPIC = "REDIS_MQ_TOPIC";        // 订阅主题
    private static final String REDIS_MQ_TOPIC2 = "GATEWAY_WHITE_URL_TOPIC";        // 订阅主题

    /**
     * Redis消息监听器容器（实现方式一）
     *
     * @param redisConnectionFactory    连接工厂
     * @param listener                  消息监听器
     * @return Redis消息监听容器
     */
    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory redisConnectionFactory,
            MessageListenerAdapter listener) {
        log.info("===================实例化 container ==========================");
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        // 设置连接工厂
        container.setConnectionFactory(redisConnectionFactory);
        // 订阅频道（可以添加多个）
        container.addMessageListener(listener, new PatternTopic(RedisCommonConstant.REDIS_MQ_TOPIC));
        //container.addMessageListener(listener, new PatternTopic(REDIS_MQ_TOPIC2));

        return container;
    }

    /*
     * 消息监听器适配器，绑定消息处理器，利用反射技术调用消息处理器的业务方法
     * 将MessageReceiver注册为一个消息监听器，可以自定义消息接收的方法（handleMessage）
     * 如果不指定消息接收的方法，消息监听器会默认的寻找MessageReceiver中的onMessage这个方法作为消息接收的方法
     */
    @Bean
    public MessageListenerAdapter listenerAdapter(RedisMessageReceiver messageReceiver) {
        return new MessageListenerAdapter(messageReceiver, "onMessage");
    }


}
